/*=========================================================
 *  系统调用函数
 * Auther: pegasus
 * description:   .110315 实现SWI宏
 * modify:        .110317 修正SWI宏，只要简步骤即可实现切换
					
 *=========================================================*/
#include <type.h>

//====================
// 此时的操作堆栈仍在用户栈，在传参时
//　压入的栈是用户栈，当进入swi为模式转
//  化为SVC模式，SP指针会变化
//  此时不会发生线程切换，因此不用保存sp位置
//  此处要先构架好Ｃ函数调用堆栈
/*==============================
 * 此时已经是C堆栈，所以只要鉵发SWI即可
 * 但要涉及堆栈切换，所以要堆栈指针
 * r0 用户栈指针
 *==============================*/
#define swi(arg) do\
{\
	__asm__ __volatile__ ( "stmfd sp!, {r0}\n\t"\
						   "mov   r0,  sp\n\t");\
	__asm__ __volatile__ (arg);\
	__asm__ __volatile__ ( "ldmfd sp!, {r0}" );\
}while(0)

/*===========================
 *   系统调用测试函数
 *===========================*/
/*
void syscall_test0()
{
	swi("swi 0x0");
}

void syscall_test1(int arg1)
{
	swi("swi 0x1");
}

void syscall_test2(int arg1, int arg2, int arg3, int arg4, int arg5)
{
	swi("swi 0x2");
}
*/

/*==========================
 *  系统调用函数  1-9  线程相关接口
 *==========================*/
acoral_id create_comm_thread(void (*route)(void *args),
		                     acoral_u32 stack_size,
							 void *args, acoral_char *name,
							 acoral_u8 prio, acoral_8 cpu)
{
	swi("swi 0x0");
}

acoral_id create_thread_ext(void (*route)(void *args),
		                    acoral_u32 stack_size,
							void *args, acoral_char *name,
							void *stack, acoral_u32 sched_policy,
							void *data)
{
	swi("swi 0x1");
}
/*
void acoral_posix_create( acoral_id* id,
		                  acoral_posix_policy_data_t *data,
						  void (*route)(void *args),
						  void *args)
{
	swi("swi 0x2");
}
*/
//
void acoral_thread_exit()
{
	swi("swi 0x3");
}

// 软件延时接口(任务不切换)(单位100ms)
void acoral_soft_delay(acoral_u32 n100ms)
{
	swi("swi 0x4");
}

//自我延时函数(单位ms)(任务切换)
void acoral_delay_self(acoral_time time)
{
	swi("swi 0x5");
}

//睡眠函数,将当前线程挂起
void acoral_suspend_self()
{
	swi("swi 0x6");
}

//挂起指定 ID 对应的线程,使其睡眠
void acoral_suspend_thread_by_id(acoral_u32 thread_id)
{
	swi("swi 0x7");
}

//唤醒指定 ID 对应的线程,使其进入就绪态
void acoral_resume_thread_by_id(acoral_u32 thread_id)
{
	swi("swi 0x8");
}

//当前线程所在的 cpu
//coral_current_cpu
void acoral_get_cur_cpu()
{
	swi("swi 0x9");
}

/*==========================
 *  系统调用函数  10-   线程交互类接口
 *==========================*/







